package com.hd.trans.network;


import android.text.TextUtils;

import com.hd.trans.TranslationInterior;
import com.hd.trans.common.Constants;
import com.hd.trans.ui.base.AppContextProvider;
import com.hd.trans.utils.CommonUtil;
import com.hd.trans.utils.DeviceUtil;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * Author: yang
 * Date: 2018/11/26 11:05
 * Desc: 请求参数Json
 */
public final class ParamJson {

    /**
     * token参数
     */
    public static class TokenParam {

        public String token;

        public TokenParam(String token) {
            this.token = token;
        }

    }


    /**
     * 通用参数
     */
    public static class CommonParam {


        public String deviceid;//
        //        public String clientip;//客户端IP地址（通过服务器转发的需要此字段，其它直连接口的不需要填写）
        public String productinfo;//
        public String timestamp;//
        public String datasign;//


        public CommonParam() {
            init();
            makeSign();
        }

        protected void init() {
            this.productinfo = TranslationInterior.getProductInfo();//
            this.deviceid = DeviceUtil.getDeviceId(AppContextProvider.getContext());
            this.timestamp = String.format("%010d", CommonUtil.getServiceTimeStamp());
        }

        protected Map<String, Object> buildParams() {
            Map<String, Object> params = new HashMap<>();
            params.put("deviceid", deviceid);
            params.put("productinfo", productinfo);
            params.put("timestamp", timestamp);
            return params;
        }

        public void makeSign() {
            String signOrig = getFormatParams(sortMapByKey(buildParams())).concat("hUuPd20171206LuOnD");
            this.datasign = Constants.getMD5(signOrig);
        }

    }


    /**
     *  翻译
     */
    public static class TranslationParam extends CommonParam {

        public String fanyicon;//对传入内容进行 URL编码；待翻译的内容,字符长度不能大于5000个字符；如果多于5000个字符请分多次提交；建议 控制在 2000个字符以内提交；
        public String fanyifrom;//源语言类型，如zh
        public String fanyito;//目标语言类型，如en
        /**默认为0,现有两个内核可选，取值范围为：0（不指定）1，2（默认使用的内核）; 当指定内核时：调用端应首先判断此内核是不是支持 选中的语种类型；
         *支持的语言
         *内核1： zh(中文), en(英语), yue(粤语), wyw(文言文-独有), ja(日语), ko(韩语), fr(法语), es(西班牙语),
         * th(泰语), ar(阿拉伯语), ru(俄语), pt(葡萄牙语), de(德语), it(意大利语), el(希腊语), nl(荷兰语),
         * pl(波兰语), bg(保加利亚语), et(爱沙尼亚语), da(丹麦语), fi(芬兰语), cs(捷克语), ro(罗马尼亚语),
         * sl(斯洛文尼亚语), sv(瑞典语), hu(匈牙利语), cht(中文繁体), vi(越南语)
         *内核2：所有（也是默认使用的内核）
         */
        public int coretag;//内核选择

        private TranslationParam(Builder builder) {
            fanyicon = builder.fanyicon;
            fanyifrom = builder.fanyifrom;
            fanyito = builder.fanyito;
            chooseCoreTag(fanyifrom,fanyito);
            init();
            makeSign();
        }

        private void chooseCoreTag(String fanyifrom, String fanyito) {
            if (TextUtils.isEmpty(fanyifrom) || TextUtils.isEmpty(fanyito)) {
                coretag = 0;
            }else if("wyw".equals(fanyifrom) || "wyw".equals(fanyito)){
                coretag = 1;//文言文属于内核1独有
            }else {
                /*if (Products.TRANSLATION_CORE_1.contains(fanyifrom)
                        && Products.TRANSLATION_CORE_1.contains(fanyito)) {
                    coretag = 1;
                } else {
                    coretag = 2;
                }*/
                coretag = 2;//内核2支持所有语种,除了“文言文”wyw
            }
        }

        protected Map<String, Object> buildParams() {
            Map<String, Object> params = super.buildParams();
            params.put("fanyicon", fanyicon);
            params.put("fanyifrom", fanyifrom);
            params.put("fanyito", fanyito);
            params.put("coretag", coretag);
            return params;
        }


        public static final class Builder {
            private String fanyicon;
            private String fanyifrom;
            private String fanyito;

            public Builder() {
            }

            public Builder fanyicon(String val) {
                fanyicon = val;
                return this;
            }

            public Builder fanyifrom(String val) {
                fanyifrom = val;
                return this;
            }

            public Builder fanyito(String val) {
                fanyito = val;
                return this;
            }

            public TranslationParam build() {
                return new TranslationParam(this);
            }
        }
    }

    /**
     * 语种识别
     */
    public static class LanguageParam extends CommonParam {

        public String fanyicon;//对传入内容进行 URL编码；待识别的内容,字符长度不能大于5000个字符；如果多于5000个字符请分多次提交；建议 控制在 2000个字符以内提交；

        public LanguageParam(String fanyicon) {
            this.fanyicon = fanyicon;
            init();
            makeSign();
        }

        protected Map<String, Object> buildParams() {
            Map<String, Object> params = super.buildParams();
            params.put("fanyicon", fanyicon);
            return params;
        }
    }


    /**
     * 微信登录
     */
    public static class WxLoginParam extends CommonParam {

        public String wechatcode; //微信临时票据
        public int clienttype; //客户端类型：0 手机端微信；1 微信小程序；2 百度小程序；默认为0
        public int showvip; //是否显示vip信息，取值范围 0（不显示）或1(显示)，默认为0


        public WxLoginParam(String wechatcode) {
            this.wechatcode = wechatcode;
            this.clienttype = 0;
            this.showvip = 1;
            init();
            makeSign();
        }

        protected Map<String, Object> buildParams() {
            Map<String, Object> params = super.buildParams();
            params.put("wechatcode", wechatcode);
            params.put("clienttype", clienttype);
            params.put("showvip", showvip);
            return params;
        }

    }


    /**
     * 虚拟账号登录
     */
    public static class VRLoginParam extends CommonParam {

        public String devicetype = "andriod"; //设备类型：andriod/ios/pc/wap/miniapp/pcapp 必填
        public String andriodid = ""; //必须为32位长度  安卓的系统ID(ANDROID_ID是Android系统第一次启动时产生的一个64bit（16BYTES）数，如果设备被wipe还原后，该ID将被重置（变化）。)
        public int showvip = 1; //是否显示vip信息，取值范围 0（不显示）或1(显示)，默认为0


        public VRLoginParam(String andriodid) {
            this.andriodid = andriodid;
            init();
            makeSign();
        }

        protected Map<String, Object> buildParams() {
            Map<String, Object> params = super.buildParams();
            params.put("andriodid", andriodid);
            params.put("devicetype", devicetype);
            params.put("showvip", showvip);
            return params;
        }

    }


    /**
     * 下载语音文件参数
     */
    public static class DownloadVoiceParam extends CommonParam {

        public String text;//待合成的文字内容(1-500)
        public int speed;//语速,默认为5，取值范围（1-15）
        public String textlanguage;//文本的语言，默认zh-CN（中文）
        public String audiotype;//取值范围有 mp3(默认),wav,pcm;

        public int volume;//音量,默认为100，取值范围（1-100）
        public String voicetag;//发音人，如不指定则取默认值
        //        public String usertoken;//会员登录token，非会员不填写;
        public String voicegender;//发音人男(1)或女(2)；默认为男声或第一个发音人

        private DownloadVoiceParam(Builder builder) {
            text = builder.text;
            textlanguage = builder.textlanguage;
            speed = builder.speed;
            audiotype = builder.audiotype;
            volume = builder.volume;
            voicetag = builder.voicetag;
            voicegender = builder.voicegender.equals("0")?null:builder.voicegender;
            init();
            makeSign();
        }


        protected Map<String, Object> buildParams() {
            Map<String, Object> params = super.buildParams();
            params.put("audiotype", audiotype);
            params.put("speed", speed);
            params.put("text", text);
            params.put("textlanguage", textlanguage);
            params.put("volume", volume);
            if(!TextUtils.isEmpty(voicetag))
                params.put("voicetag", voicetag);
            if(!TextUtils.isEmpty(voicegender))
                params.put("voicegender", voicegender);
            return params;
        }


        public static final class Builder {
            private String text;
            private int speed;
            private String textlanguage;
            private String audiotype;

            private int volume = 100;
            private String voicetag;
            private String voicegender = "0";

            public Builder() {
            }

            public Builder text(String val) {
                text = val;
                return this;
            }

            public Builder speed(int val) {
                speed = val;
                return this;
            }

            public Builder textlanguage(String val) {
                textlanguage = val;
                return this;
            }

            public Builder audiotype(String val) {
                audiotype = val;
                return this;
            }

            public Builder volume(int val) {
                volume = val;
                return this;
            }

            public Builder voicetag(String val){
                voicetag = val;
                return this;
            }

            public Builder voicegender(String val){
                voicegender = val;
                return this;
            }

            public DownloadVoiceParam build() {
                return new DownloadVoiceParam(this);
            }
        }
    }





    /*
     * **************************************************************************************************
     * **************************************************************************************************
     * **************************************************************************************************
     * **************************************************************************************************
     * **************************************************************************************************
     * */

    /**
     * 参数拼接
     */
    public static String getFormatParams(Map<String, Object> params) {
        if (params != null && !params.isEmpty()) {
            StringBuilder sb = new StringBuilder();
            for (Map.Entry<String, Object> entry : params.entrySet()) {
//                支付接口 payorer 加密时 因为 在payorderparm中 prouctid加密处理过，所以 待加密中 productid 不再参与；
//                if ("papertxt".equals(entry.getKey())){
//                    continue;
//                }
                String key = entry.getKey();
                Object value = entry.getValue();
                sb.append(key);
                sb.append("=");
                sb.append(value);
                sb.append("&");
            }
            return sb.toString().substring(0, sb.toString().length() - 1);
        } else {
            return "";
        }
    }


    /**
     * 使用 Map按key进行排序
     */
    public static Map<String, Object> sortMapByKey(Map<String, Object> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }
        Map<String, Object> sortMap = new TreeMap<>(new MapKeyComparator());
        sortMap.putAll(map);
        return sortMap;
    }

    /**
     * 排序
     */
    public static class MapKeyComparator implements Comparator<String> {

        @Override
        public int compare(String str1, String str2) {
            return str1.compareTo(str2);
        }
    }


}
